package transformers;

import asms.LoaderVisitor;
import org.objectweb.asm.*;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

public class LoaderTransformer implements ClassFileTransformer {

    /**
     * 加载的每一个类都会进入到transform方法，这里我们筛选一下，只处理指定的controller.Load类。
     * */
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

        if (className.replaceAll("/",".").equals("com.any0ne.loadDemo.Load")){
            System.out.println("I find the target class.Then I'll modify this class.");
            /**
             * asm修改字节码的关键点，ClassReader、ClassWriter、ClassVisitor
             * Reader读取指定类的字节码.Visitor里则包含了修改代码的逻辑.
             * 调用ClassReader.accept之后，asm会扫描指定类的字节码，并在扫描代码的某一位置时会自动调用对应方法。
             * 比如扫描到方法时会自动调用MethodVisitor.visitCode()去处理这段方法对应的代码.
             * */
            ClassReader classReader = new ClassReader(classfileBuffer);
            ClassWriter classWriter = new ClassWriter(classReader, Opcodes.ASM5);
            ClassVisitor classVisitor = new LoaderVisitor(classWriter);
            classReader.accept(classVisitor,ClassReader.SKIP_DEBUG);
            byte[] bytes = classWriter.toByteArray();

            return bytes;
        }
        return new byte[0];
    }
}